<template>
    <div class="side-navBar">
        <div 
            v-if="props.navLists?.length > 0"
            class="side-navBar-ul"
        >
            <div
                @click="itemClick(index)"
                v-for="(item, index) in props.navLists"
                :key="index"
                :class="moveIndex === index ? 'activeLight' : ''"
                class="side-navBar-li"
            >
                <div :class="['side-navBar-text-' + (item.level ? item.level : 1)]">{{ item.text }}</div>
            </div>
        </div>
    </div>
</template>
  
<script lang="ts" setup>
    // ！！！注意本组件只允许放在需要监听滚动页面的最底部，因为我们是通过父元素的节点获得内部所有子元素的高度所以必须要放在父元素中的最底部
    import { ref, reactive, markRaw, onBeforeMount, onMounted, onBeforeUnmount, nextTick, computed, watch } from 'vue'
    import type { Ref, Raw } from 'vue'
    import { useRoute, useRouter } from 'vue-router'
    import { storeToRefs } from 'pinia'
    import { useStore } from '@/store'
    import { ElMessage } from 'element-plus'

    const props = withDefaults(defineProps<{
        navLists?: any[], 
    }>(), {
        navLists: () => [],
    })

    const moveIndex:Ref<number> = ref(0)
    const ContentHeightList:Ref<any[]> = ref([])

    // 点击nav栏后
    const itemClick = (index) => {
        // console.log('itemClick')

        // 获取父元素的dom元素
        // let pageScrooll = document.querySelector(".side-navBar").parentNode;
        
        // 点击后滚动到相应的区域
        // pageScrooll.children[index].scrollIntoView(true)

        document.getElementById(props.navLists[index].id).scrollIntoView(true)
        // 激活当前高亮nav栏
        setTimeout(() => {
            moveIndex.value = index;
        }, 0);
    }
    // 获取页面中每一栏内容的高度数组
    const getChildrenHeigh = () => {
       // 获得他们的父元素节点
        // let pageScrooll: any = document.querySelector(".side-navBar").parentNode;
        let arr = [];
        // 将所有子元素的高度放入arr
        for (let i = 0; i < props.navLists.length; i++) {
            // 把所有获得到的子元素高度都放入arr中
            // arr.push(pageScrooll.children[i].offsetTop);
            arr.push(document.getElementById(props.navLists[i].id).offsetTop);
        }
        // 给这个arr兜底，这样可以解决最后一个内容栏监听不到的bug，注意：如果最后一栏内容高度低于滚动条当前的高度，也不会高亮显示最后一栏的标题哦
        arr.push(Number.MAX_VALUE);
        ContentHeightList.value = arr;
        // console.log(arr)
    }
    // 监听滚轮
    const handleScroll = () => {
        // console.log('handleScroll')
        // 获得他们的父元素节点
        let pageScrooll: any = document.querySelector(".side-navBar")?.parentNode?.children[0];
       // 获得当前的滚轮高度
        // var scrollTop =
        //     window.pageYOffset ||
        //     document.documentElement.scrollTop ||
        //     document.body.scrollTop;
        let scrollTop = pageScrooll?.scrollTop
        // console.log(scrollTop)
        // console.log(pageScrooll.scrollHeight)
        // console.log(pageScrooll.offsetHeight)
        // console.log(document.getElementById(props.navLists[4].id).offsetTop)
        // console.log(document.getElementById(props.navLists[4].id).offsetHeight)
        // console.log(pageScrooll.scrollTop+pageScrooll.offsetHeight)

        let Heights = ContentHeightList.value;
        // 只有ContentHeightList存在才监听当前高度
        if (Heights?.length > 0) {
            // 如果滚动的高度加上页面的高度等于元素总共的高度则激活最后一个nav栏目
            if (scrollTop+pageScrooll.offsetHeight == pageScrooll.scrollHeight) {
                moveIndex.value = Heights.length-2;
            } else {
                for (let i = 0; i < Heights.length; i++) {
                    // 如果滚轮高度大于当前所在的子元素高度 并且 滚轮高度小于下一个子元素的高度 ，那么说明滚轮在当前内容中，就激活当前的nav栏
                    if (scrollTop >= Heights[i] && scrollTop <= Heights[i + 1]) {
                        // 那么就激活当前的nav栏
                        moveIndex.value = i;
                        // return false;
                    }
                }
            }
        }
    }
    onMounted(() => {
        // 监听滚动
        window.addEventListener("scroll", handleScroll, true);
        // 获得内容高度
        nextTick(() => {
            getChildrenHeigh();
        })
    })
    onBeforeUnmount(() => {
        ContentHeightList.value = [];
        window.removeEventListener("scroll", handleScroll, true);
    })


</script>

<style lang="scss" scoped>
    .side-navBar {
        // position: fixed;
        // top: 0px;
        // left: 0px; //改为right 就是右侧边栏
        box-sizing: border-box;
        padding: 5px 5px 5px 0;
        height: 100%;
        display: flex;
        flex-direction: column;
        // justify-content: center;
        // z-index: 99999;
        // max-width: 145px;
        min-width: 250px;
        background: #ffffff;
    }
    .side-navBar-ul {
        box-shadow: 20px 0px 10px 1px rgba(0, 0, 0, 0.2);
        height: 100%;
        overflow: auto;
        // border-radius: 0px 10px 10px 0px;
        .side-navBar-li {
            padding: 5px;
            padding-left: 20px;
            font-size: 14px;
            font-family: PingFangSC-Regular, PingFang SC;
            font-weight: bold;
            // color: rgba(0, 0, 0, 0.85);
            line-height: 20px;
            cursor: pointer;
            position: relative;
        }
    }
    .activeLight {
        color: #096dd9 !important;
    }
    .side-navBar-text-1 {

    }
    .side-navBar-text-2 {
        padding-left: 20px;
    }
    .side-navBar-text-3 {
        padding-left: 40px;
    }

</style>